Skip to content

Elasticsearch QueryString 查詢語法筆記

TLDR

  • query_string 是基於 Lucene 的查詢語法,適合快速檢索。
  • 預設運算子為 OR,多詞彙搜尋時若欄位為 keyword 型別,須加雙引號或使用 OR 連接。
  • 比較運算子(>< 等)不支援 fields 陣列參數,建議統一使用範圍查詢語法 [x TO y]
  • 日期查詢不支援比較運算子,且標準格式(含 :)必須使用雙引號包覆。
  • 模糊搜尋 ~ 與近似搜尋 ~N 必須搭配 fuzzinessphrase_slop 參數,且查詢字串中的設定優先於 API 參數。
  • 欄位加權 ^ 影響欄位間的相對分數,查詢 boost 影響複合查詢中子句的相對重要性。

基本語法與 API 結構

query_string 是 Elasticsearch 中基於 Lucene 查詢語法的擴展,適合在 Elasticvue 或 Kibana Discover 等介面進行快速全文檢索。

基本 API 結構

json
{
  "query": {
    "query_string": {
      "query": "your query string here",
      "default_field": "content",
      "default_operator": "OR"
    }
  },
  "size": 10,
  "from": 0,
  "sort": []
}

查詢語法行為差異

不同欄位類型的搜尋行為

什麼情況下會遇到搜尋不到資料的問題?當針對 keyword 或數值欄位進行多詞彙搜尋時,若未正確使用雙引號或運算子,會因無法分詞而導致搜尋失敗。

欄位類型查詢字串行為說明
textapple banana等同 apple OR banana,找到任一詞彙即符合
keyword"apple" "banana"必須用雙引號明確搜尋多個完整字串,或使用 OR
數值/日期123 456查不到,因為 query_string 不會自動拆分多個完整值

範圍查詢與比較運算子

比較運算子限制

什麼情況下會遇到查詢錯誤?在 query_string 中使用 fields 陣列參數搭配比較運算子(如 >>=)會導致解析失敗。

  • 建議做法:改用範圍查詢語法 [x TO y],此語法與 fields 參數完全相容。
json
// ❌ 錯誤寫法:使用 fields 陣列會導致查詢失敗
{
  "query": {
    "query_string": {
      "query": ">=10",
      "fields": ["price"]
    }
  }
}

// ✅ 正確做法:使用範圍查詢語法
{
  "query": {
    "query_string": {
      "query": "[10 TO *]",
      "fields": ["price"]
    }
  }
}

日期時間查詢

日期查詢注意事項

什麼情況下會遇到日期查詢失效?當使用比較運算子查詢日期,或日期格式包含冒號(:)卻未加雙引號時。

  • 標準格式需加雙引號:因 : 為特殊字元,如 timestamp:"2023-01-15T08:30:00Z"
  • 不支援比較運算子:日期欄位不支援 ><,請務必使用 [start TO end] 範圍語法。
  • 格式嚴謹性:若欄位定義了特定 format,查詢字串必須完全符合該格式,否則會發生 failed to parse date field 錯誤。

權重控制:Boost 與欄位加權

欄位加權 (Field Boost)

使用 ^ 語法調整特定欄位權重,適用於多欄位搜尋時,強調標題(Title)比內容(Content)更具代表性的場景。

json
{
  "query_string": {
    "query": "apple iphone",
    "fields": ["title^3", "content"]
  }
}

查詢層級 Boost (Query Boost)

bool 複合查詢中,調整整個查詢子句的重要性。注意:若單獨使用一個查詢,boost 不會改變排序結果。


模糊搜尋與近似搜尋

模糊與近似語法

什麼情況下會遇到參數設定無效?當查詢字串中未包含 ~ 符號時,全域的 fuzzinessphrase_slop 參數將不會生效。

  • 模糊搜尋 (~):用於單詞後,處理拼寫錯誤。
  • 近似搜尋 (~N):用於引號包圍的片語後,處理詞彙順序與距離(Slop)。

優先順序規則

  1. 查詢字串中的 ~N(明確數字)優先級最高。
  2. 查詢字串中的 ~(無數字)搭配 API 參數。
  3. 若無 ~,則視為精確匹配,參數設定無效。

異動歷程

    • 初版文件建立。
    • 修正語句用詞,統一使用台灣慣用語。
    • 修正日期查詢範圍語法說明(日期欄位不支援比較運算子,應使用範圍查詢語法)。
    • 修正權重計算遺漏欄位基礎分數的部分。
    • 補充技術細節。